home *** CD-ROM | disk | FTP | other *** search
- <?php
- /**
- * HTML loading bar with only PHP and JS interface.
- *
- * PHP versions 4 and 5
- *
- * LICENSE: This source file is subject to version 3.0 of the PHP license
- * that is available through the world-wide-web at the following URI:
- * http://www.php.net/license/3_0.txt. If you did not receive a copy of
- * the PHP License and are unable to obtain it through the web, please
- * send a note to license@php.net so we can mail you a copy immediately.
- *
- * @category HTML
- * @package HTML_Progress
- * @author Laurent Laville <pear@laurent-laville.org>
- * @copyright 1997-2005 The PHP Group
- * @license http://www.php.net/license/3_0.txt PHP License 3.0
- * @version CVS: $Id: Progress.php,v 1.19 2005/10/15 11:12:23 farell Exp $
- * @link http://pear.php.net/package/HTML_Progress
- * @since File available since Release 1.0
- */
-
- require_once 'HTML/Progress/DM.php';
- require_once 'HTML/Progress/UI.php';
-
- /**#@+
- * Progress Bar shape types
- *
- * @var integer
- * @since 0.6
- */
- define ('HTML_PROGRESS_BAR_HORIZONTAL', 1);
- define ('HTML_PROGRESS_BAR_VERTICAL', 2);
- /**#@-*/
-
- /**#@+
- * Progress Bar shape types
- *
- * @var integer
- * @since 1.2.0RC1
- */
- define ('HTML_PROGRESS_POLYGONAL', 3);
- define ('HTML_PROGRESS_CIRCLE', 4);
- /**#@-*/
-
- /**
- * Basic error code that indicate a wrong input
- *
- * @var integer
- * @since 1.0
- */
- define ('HTML_PROGRESS_ERROR_INVALID_INPUT', -100);
-
- /**
- * Basic error code that indicate a wrong callback definition.
- * Allows only function or class-method structure.
- *
- * @var integer
- * @since 1.1
- */
- define ('HTML_PROGRESS_ERROR_INVALID_CALLBACK',-101);
-
- /**
- * Basic error code that indicate a deprecated method
- * that may be removed at any time from a future version
- *
- * @var integer
- * @since 1.2.0RC1
- */
- define ('HTML_PROGRESS_DEPRECATED', -102);
-
- /**#@+
- * One of five possible return values from the error Callback
- *
- * @see HTML_Progress::_handleError
- * @var integer
- * @since 1.2.0
- */
- /**
- * If this is returned, then the error will be both pushed onto the stack
- * and logged.
- */
- define('HTML_PROGRESS_ERRORSTACK_PUSHANDLOG', 1);
- /**
- * If this is returned, then the error will only be pushed onto the stack,
- * and not logged.
- */
- define('HTML_PROGRESS_ERRORSTACK_PUSH', 2);
- /**
- * If this is returned, then the error will only be logged, but not pushed
- * onto the error stack.
- */
- define('HTML_PROGRESS_ERRORSTACK_LOG', 3);
- /**
- * If this is returned, then the error is completely ignored.
- */
- define('HTML_PROGRESS_ERRORSTACK_IGNORE', 4);
- /**
- * If this is returned, then the error will only be logged, but not pushed
- * onto the error stack because will halt script execution.
- */
- define('HTML_PROGRESS_ERRORSTACK_LOGANDDIE', 5);
- /**#@-*/
-
-
- /**#@+
- * Log types for PHP's native error_log() function
- *
- * @see HTML_Progress::_errorHandler
- * @var integer
- * @since 1.2.0
- */
- /**
- * Use PHP's system logger
- */
- define('HTML_PROGRESS_LOG_TYPE_SYSTEM', 0);
- /**
- * Use PHP's mail() function
- */
- define('HTML_PROGRESS_LOG_TYPE_MAIL', 1);
- /**
- * Append to a file
- */
- define('HTML_PROGRESS_LOG_TYPE_FILE', 3);
- /**#@-*/
-
- /**
- * Global error message callback.
- * This will be used to generate the error message
- * from the error code.
- *
- * @global false|string|array $GLOBALS['_HTML_PROGRESS_CALLBACK_MESSAGE']
- * @since 1.2.0
- * @access private
- * @see HTML_Progress::_initErrorHandler
- */
- $GLOBALS['_HTML_PROGRESS_CALLBACK_MESSAGE'] = false;
-
- /**
- * Global error context callback.
- * This will be used to generate the error context for an error.
- *
- * @global false|string|array $GLOBALS['_HTML_PROGRESS_CALLBACK_CONTEXT']
- * @since 1.2.0
- * @access private
- * @see HTML_Progress::_initErrorHandler
- */
- $GLOBALS['_HTML_PROGRESS_CALLBACK_CONTEXT'] = false;
-
- /**
- * Global error push callback.
- * This will be called every time an error is pushed onto the stack.
- * The return value will be used to determine whether to allow
- * an error to be pushed or logged.
- *
- * @global false|string|array $GLOBALS['_HTML_PROGRESS_CALLBACK_PUSH']
- * @since 1.2.0
- * @access private
- * @see HTML_Progress::_initErrorHandler
- */
- $GLOBALS['_HTML_PROGRESS_CALLBACK_PUSH'] = false;
-
- /**
- * Global error handler callback.
- * This will handle any errors raised by this package.
- *
- * @global false|string|array $GLOBALS['_HTML_PROGRESS_CALLBACK_ERRORHANDLER']
- * @since 1.2.0
- * @access private
- * @see HTML_Progress::_initErrorHandler
- */
- $GLOBALS['_HTML_PROGRESS_CALLBACK_ERRORHANDLER'] = false;
-
- /**
- * Global associative array of key-value pairs
- * that are used to specify any handler-specific settings.
- *
- * @global array $GLOBALS['_HTML_PROGRESS_ERRORHANDLER_OPTIONS']
- * @since 1.2.0
- * @access private
- * @see HTML_Progress::_initErrorHandler
- */
- $GLOBALS['_HTML_PROGRESS_ERRORHANDLER_OPTIONS'] = array();
-
- /**
- * Global error stack for this package.
- *
- * @global array $GLOBALS['_HTML_PROGRESS_ERRORSTACK']
- * @since 1.2.0
- * @access private
- * @see HTML_Progress::raiseError
- */
- $GLOBALS['_HTML_PROGRESS_ERRORSTACK'] = array();
-
-
- /**
- * HTML loading bar with only PHP and JS interface.
- *
- * The HTML_Progress class allow you to add a loading bar
- * to any of your xhtml document.
- * You should have a browser that accept DHTML feature.
- *
- * @category HTML
- * @package HTML_Progress
- * @author Laurent Laville <pear@laurent-laville.org>
- * @copyright 1997-2005 The PHP Group
- * @license http://www.php.net/license/3_0.txt PHP License 3.0
- * @version Release: 1.2.5
- * @link http://pear.php.net/package/HTML_Progress
- * @since Class available since Release 1.0
- */
-
- class HTML_Progress
- {
- /**
- * Whether the progress bar is in determinate or indeterminate mode.
- * The default is false.
- * An indeterminate progress bar continuously displays animation indicating
- * that an operation of unknown length is occuring.
- *
- * @var boolean
- * @since 1.0
- * @access private
- * @see setIndeterminate(), isIndeterminate()
- */
- var $_indeterminate;
-
- /**
- * Whether to display a border around the progress bar.
- * The default is false.
- *
- * @var boolean
- * @since 1.0
- * @access private
- * @see setBorderPainted(), isBorderPainted()
- */
- var $_paintBorder;
-
- /**
- * Whether to textually display a string on the progress bar.
- * The default is false.
- * Setting this to true causes a textual display of the progress to be rendered
- * on the progress bar. If the $_progressString is null, the percentage of completion
- * is displayed on the progress bar. Otherwise, the $_progressString is rendered
- * on the progress bar.
- *
- * @var boolean
- * @since 1.0
- * @access private
- * @see setStringPainted(), isStringPainted()
- */
- var $_paintString;
-
- /**
- * An optional string that can be displayed on the progress bar.
- * The default is null.
- * Setting this to a non-null value does not imply that the string
- * will be displayed.
- *
- * @var string
- * @since 1.0
- * @access private
- * @see getString(), setString()
- */
- var $_progressString;
-
- /**
- * The data model (HTML_Progress_DM instance or extends)
- * handles any mathematical issues arising from assigning faulty values.
- *
- * @var object
- * @since 1.0
- * @access private
- * @see getDM(), setDM()
- */
- var $_DM;
-
- /**
- * The user interface (HTML_Progress_UI instance or extends)
- * handles look-and-feel of the progress bar.
- *
- * @var object
- * @since 1.0
- * @access private
- * @see getUI(), setUI()
- */
- var $_UI;
-
- /**
- * The label that uniquely identifies this progress object.
- *
- * @var string
- * @since 1.0
- * @access private
- * @see getIdent(), setIdent()
- */
- var $_ident;
-
- /**
- * Holds all HTML_Progress_Observer objects that wish to be notified of new messages.
- *
- * @var array
- * @since 1.0
- * @access private
- * @see getListeners(), addListener(), removeListener()
- */
- var $_listeners;
-
- /**
- * Delay in milisecond before each progress cells display.
- * 1000 ms === sleep(1)
- * <strong>usleep()</strong> function does not run on Windows platform.
- *
- * @var integer
- * @since 1.1
- * @access private
- * @see setAnimSpeed()
- */
- var $_anim_speed;
-
- /**
- * Callback, either function name or array(&$object, 'method')
- *
- * @var mixed
- * @since 1.2.0RC3
- * @access private
- * @see setProgressHandler()
- */
- var $_callback = null;
-
-
- /**
- * Constructor Summary
- *
- * o Creates a natural horizontal progress bar that displays ten cells/units
- * with no border and no progress string.
- * The initial and minimum values are 0, and the maximum is 100.
- * <code>
- * $bar = new HTML_Progress();
- * </code>
- *
- * o Creates a natural progress bar with the specified orientation, which can be
- * either HTML_PROGRESS_BAR_HORIZONTAL or HTML_PROGRESS_BAR_VERTICAL
- * By default, no border and no progress string are painted.
- * The initial and minimum values are 0, and the maximum is 100.
- * <code>
- * $bar = new HTML_Progress($orient);
- * </code>
- *
- * o Creates a natural horizontal progress bar with the specified minimum and
- * maximum. Sets the initial value of the progress bar to the specified
- * minimum, and the maximum that the progress bar can reach.
- * By default, no border and no progress string are painted.
- * <code>
- * $bar = new HTML_Progress($min, $max);
- * </code>
- *
- * o Creates a natural horizontal progress bar with the specified orientation,
- * minimum and maximum. Sets the initial value of the progress bar to the
- * specified minimum, and the maximum that the progress bar can reach.
- * By default, no border and no progress string are painted.
- * <code>
- * $bar = new HTML_Progress($orient, $min, $max);
- * </code>
- *
- * o Creates a natural horizontal progress that uses the specified model
- * to hold the progress bar's data.
- * By default, no border and no progress string are painted.
- * <code>
- * $bar = new HTML_Progress($model);
- * </code>
- *
- *
- * @param object $model (optional) Model that hold the progress bar's data
- * @param int $orient (optional) Orientation of progress bar
- * @param int $min (optional) Minimum value of progress bar
- * @param int $max (optional) Maximum value of progress bar
- * @param array $errorPrefs (optional) Always last argument of class constructor.
- * hash of params to configure PEAR_ErrorStack and loggers
- *
- * @since 1.0
- * @access public
- * @throws HTML_PROGRESS_ERROR_INVALID_INPUT
- * @see setIndeterminate(),
- * setBorderPainted(), setStringPainted(), setString(),
- * setDM(), setUI(), setIdent()
- */
- function HTML_Progress()
- {
- $args = func_get_args();
- $num_args = func_num_args();
-
- if ($num_args > 0) {
- $errorPrefs = func_get_arg($num_args - 1);
- if (!is_array($errorPrefs)) {
- $errorPrefs = array();
- } else {
- $num_args--;
- }
- HTML_Progress::_initErrorHandler($errorPrefs);
- } else {
- HTML_Progress::_initErrorhandler();
- }
-
- $this->_listeners = array(); // none listeners by default
-
- $this->_DM = new HTML_Progress_DM(); // new instance of a progress DataModel
- $this->_UI = new HTML_Progress_UI(); // new instance of a progress UserInterface
-
- switch ($num_args) {
- case 1:
- if (is_object($args[0]) && (is_a($args[0], 'html_progress_dm'))) {
- /* object html_progress_dm extends */
- $this->_DM = &$args[0];
-
- } elseif (is_int($args[0])) {
- /* int orient */
- $this->_UI->setOrientation($args[0]);
-
- } else {
- return HTML_Progress::raiseError(HTML_PROGRESS_ERROR_INVALID_INPUT, 'exception',
- array('var' => '$model | $orient',
- 'was' => (gettype($args[0]) == 'object') ?
- get_class($args[0]).' object' : gettype($args[0]),
- 'expected' => 'html_progress_dm object | integer',
- 'paramnum' => 1));
- }
- break;
- case 2:
- /* int min, int max */
- if (!is_int($args[0])) {
- return HTML_Progress::raiseError(HTML_PROGRESS_ERROR_INVALID_INPUT, 'exception',
- array('var' => '$min',
- 'was' => $args[0],
- 'expected' => 'integer',
- 'paramnum' => 1));
-
- } elseif (!is_int($args[1])) {
- return HTML_Progress::raiseError(HTML_PROGRESS_ERROR_INVALID_INPUT, 'exception',
- array('var' => '$max',
- 'was' => $args[1],
- 'expected' => 'integer',
- 'paramnum' => 2));
- } else {
- $this->_DM->setMinimum($args[0]);
- $this->_DM->setMaximum($args[1]);
- }
- break;
- case 3:
- /* int orient, int min, int max */
- if (!is_int($args[0])) {
- return HTML_Progress::raiseError(HTML_PROGRESS_ERROR_INVALID_INPUT, 'exception',
- array('var' => '$orient',
- 'was' => $args[0],
- 'expected' => 'integer',
- 'paramnum' => 1));
-
- } elseif (!is_int($args[1])) {
- return HTML_Progress::raiseError(HTML_PROGRESS_ERROR_INVALID_INPUT, 'exception',
- array('var' => '$min',
- 'was' => $args[1],
- 'expected' => 'integer',
- 'paramnum' => 2));
-
- } elseif (!is_int($args[2])) {
- return HTML_Progress::raiseError(HTML_PROGRESS_ERROR_INVALID_INPUT, 'exception',
- array('var' => '$max',
- 'was' => $args[2],
- 'expected' => 'integer',
- 'paramnum' => 3));
- } else {
- $this->_UI->setOrientation($args[0]);
- $this->_DM->setMinimum($args[1]);
- $this->_DM->setMaximum($args[2]);
- }
- break;
- default:
- }
- $this->setString(null);
- $this->setStringPainted(false);
- $this->setBorderPainted(false);
- $this->setIndeterminate(false);
- $this->setIdent();
- $this->setAnimSpeed(0);
-
- // to fix a potential php config problem with PHP 4.2.0 : turn 'implicit_flush' ON
- ob_implicit_flush(1);
- }
-
- /**
- * Returns the current API version
- *
- * @return float
- * @since 0.1
- * @access public
- */
- function apiVersion()
- {
- return 1.2;
- }
-
- /**
- * Returns mode of the progress bar (determinate or not).
- *
- * @return boolean
- * @since 1.0
- * @access public
- * @see setIndeterminate()
- */
- function isIndeterminate()
- {
- return $this->_indeterminate;
- }
-
- /**
- * Sets the $_indeterminate property of the progress bar, which determines
- * whether the progress bar is in determinate or indeterminate mode.
- * An indeterminate progress bar continuously displays animation indicating
- * that an operation of unknown length is occuring.
- * By default, this property is false.
- *
- * @param boolean $continuous whether countinuously displays animation
- *
- * @return void
- * @since 1.0
- * @access public
- * @throws HTML_PROGRESS_ERROR_INVALID_INPUT
- * @see isIndeterminate()
- */
- function setIndeterminate($continuous)
- {
- if (!is_bool($continuous)) {
- return HTML_Progress::raiseError(HTML_PROGRESS_ERROR_INVALID_INPUT, 'exception',
- array('var' => '$continuous',
- 'was' => gettype($continuous),
- 'expected' => 'boolean',
- 'paramnum' => 1));
- }
- $this->_indeterminate = $continuous;
- }
-
- /**
- * Determines whether the progress bar border is painted or not.
- * The default is false.
- *
- * @return boolean
- * @since 1.0
- * @access public
- * @see setBorderPainted()
- */
- function isBorderPainted()
- {
- return $this->_paintBorder;
- }
-
- /**
- * Sets the value of $_paintBorder property, which determines whether the
- * progress bar should paint its border. The default is false.
- *
- * @param boolean $paint whether the progress bar should paint its border
- *
- * @return void
- * @since 1.0
- * @access public
- * @throws HTML_PROGRESS_ERROR_INVALID_INPUT
- * @see isBorderPainted()
- */
- function setBorderPainted($paint)
- {
- if (!is_bool($paint)) {
- return HTML_Progress::raiseError(HTML_PROGRESS_ERROR_INVALID_INPUT, 'exception',
- array('var' => '$paint',
- 'was' => gettype($paint),
- 'expected' => 'boolean',
- 'paramnum' => 1));
- }
-
- $this->_paintBorder = $paint;
- }
-
- /**
- * Determines whether the progress bar string is painted or not.
- * The default is false.
- * The progress bar displays the value returned by getPercentComplete() method
- * formatted as a percent such as 33%.
- *
- * @return boolean
- * @since 1.0
- * @access public
- * @see setStringPainted(), setString()
- */
- function isStringPainted()
- {
- return $this->_paintString;
- }
-
- /**
- * Sets the value of $_paintString property, which determines whether the
- * progress bar should render a progress string. The default is false.
- *
- * @param boolean $paint whether the progress bar should render a string
- *
- * @return void
- * @since 1.0
- * @access public
- * @throws HTML_PROGRESS_ERROR_INVALID_INPUT
- * @see isStringPainted(), setString()
- */
- function setStringPainted($paint)
- {
- if (!is_bool($paint)) {
- return HTML_Progress::raiseError(HTML_PROGRESS_ERROR_INVALID_INPUT, 'exception',
- array('var' => '$paint',
- 'was' => gettype($paint),
- 'expected' => 'boolean',
- 'paramnum' => 1));
- }
- $this->_paintString = $paint;
- }
-
- /**
- * Returns the current value of the progress string.
- * By default, the progress bar displays the value returned by
- * getPercentComplete() method formatted as a percent such as 33%.
- *
- * @return string
- * @since 1.0
- * @access public
- * @see setString(), isStringPainted()
- */
- function getString()
- {
- if ($this->isStringPainted() && !is_null($this->_progressString)) {
- return $this->_progressString;
- } else {
- return sprintf("%s", $this->getPercentComplete(false)).' %';
- }
- }
-
- /**
- * Sets the current value of the progress string. By default, this string
- * is null. If you have provided a custom progress string and want to revert
- * to the built-in-behavior, set the string back to null.
- * The progress string is painted only if the isStringPainted() method
- * returns true.
- *
- * @param string $str progress string
- *
- * @return void
- * @since 1.0
- * @access public
- * @see getString(), isStringPainted(), setStringPainted()
- */
- function setString($str)
- {
- $this->_progressString = $str;
- }
-
- /**
- * Returns the data model used by this progress bar.
- *
- * @return object
- * @since 1.0
- * @access public
- * @see setDM()
- */
- function &getDM()
- {
- return $this->_DM;
- }
-
- /**
- * Sets the data model used by this progress bar.
- *
- * @param string $model class name of a html_progress_dm extends object
- *
- * @return void
- * @since 1.0
- * @access public
- * @throws HTML_PROGRESS_ERROR_INVALID_INPUT
- * @see getDM()
- */
- function setDM($model)
- {
- if (!class_exists($model)) {
- return HTML_Progress::raiseError(HTML_PROGRESS_ERROR_INVALID_INPUT, 'error',
- array('var' => '$model',
- 'was' => 'class does not exists',
- 'expected' => $model.' class defined',
- 'paramnum' => 1));
- }
-
- $_dm = new $model();
-
- if (!is_a($_dm, 'html_progress_dm')) {
- return HTML_Progress::raiseError(HTML_PROGRESS_ERROR_INVALID_INPUT, 'error',
- array('var' => '$model',
- 'was' => $model,
- 'expected' => 'HTML_Progress_DM extends',
- 'paramnum' => 1));
- }
- $this->_DM =& $_dm;
- }
-
- /**
- * Returns the progress bar's minimum value stored in the progress bar's data model.
- * The default value is 0.
- *
- * @return integer
- * @since 1.0
- * @access public
- * @see setMinimum(),
- * HTML_Progress_DM::getMinimum()
- */
- function getMinimum()
- {
- return $this->_DM->getMinimum();
- }
-
- /**
- * Sets the progress bar's minimum value stored in the progress bar's data model.
- * If the minimum value is different from previous minimum, all change listeners
- * are notified.
- *
- * @param integer $min progress bar's minimal value
- *
- * @return void
- * @since 1.0
- * @access public
- * @see getMinimum(),
- * HTML_Progress_DM::setMinimum()
- */
- function setMinimum($min)
- {
- $oldVal = $this->getMinimum();
-
- $this->_DM->setMinimum($min);
-
- if ($oldVal != $min) {
- $this->_announce(array('log' => 'setMinimum', 'value' => $min));
- }
- }
-
- /**
- * Returns the progress bar's maximum value stored in the progress bar's data model.
- * The default value is 100.
- *
- * @return integer
- * @since 1.0
- * @access public
- * @see setMaximum(),
- * HTML_Progress_DM::getMaximum()
- */
- function getMaximum()
- {
- return $this->_DM->getMaximum();
- }
-
- /**
- * Sets the progress bar's maximum value stored in the progress bar's data model.
- * If the maximum value is different from previous maximum, all change listeners
- * are notified.
- *
- * @param integer $max progress bar's maximal value
- *
- * @return void
- * @since 1.0
- * @access public
- * @see getMaximum(),
- * HTML_Progress_DM::setMaximum()
- */
- function setMaximum($max)
- {
- $oldVal = $this->getMaximum();
-
- $this->_DM->setMaximum($max);
-
- if ($oldVal != $max) {
- $this->_announce(array('log' => 'setMaximum', 'value' => $max));
- }
- }
-
- /**
- * Returns the progress bar's increment value stored in the progress bar's data model.
- * The default value is +1.
- *
- * @return integer
- * @since 1.0
- * @access public
- * @see setIncrement(),
- * HTML_Progress_DM::getIncrement()
- */
- function getIncrement()
- {
- return $this->_DM->getIncrement();
- }
-
- /**
- * Sets the progress bar's increment value stored in the progress bar's data model.
- *
- * @param integer $inc progress bar's increment value
- *
- * @return void
- * @since 1.0
- * @access public
- * @see getIncrement(),
- * HTML_Progress_DM::setIncrement()
- */
- function setIncrement($inc)
- {
- $this->_DM->setIncrement($inc);
- }
-
- /**
- * Returns the progress bar's current value, which is stored in the
- * progress bar's data model. The value is always between the minimum
- * and maximum values, inclusive.
- * By default, the value is initialized to be equal to the minimum value.
- *
- * @return integer
- * @since 1.0
- * @access public
- * @see setValue(), incValue(),
- * HTML_Progress_DM::getValue()
- */
- function getValue()
- {
- return $this->_DM->getValue();
- }
-
- /**
- * Sets the progress bar's current value stored in the progress bar's data model.
- * If the new value is different from previous value, all change listeners
- * are notified.
- *
- * @param integer $val progress bar's current value
- *
- * @return void
- * @since 1.0
- * @access public
- * @see getValue(), incValue(),
- * HTML_Progress_DM::setValue()
- */
- function setValue($val)
- {
- $oldVal = $this->getValue();
-
- $this->_DM->setValue($val);
-
- if ($oldVal != $val) {
- $this->_announce(array('log' => 'setValue', 'value' => $val));
- }
- }
-
- /**
- * Updates the progress bar's current value by adding increment value.
- * All change listeners are notified.
- *
- * @return void
- * @since 1.0
- * @access public
- * @see getValue(), setValue(),
- * HTML_Progress_DM::incValue()
- */
- function incValue()
- {
- $this->_DM->incValue();
- $this->_announce(array('log' => 'incValue', 'value' => $this->_DM->getValue() ));
- }
-
- /**
- * Returns the percent complete for the progress bar. Note that this number is
- * between 0.00 and 1.00 or 0 and 100.
- *
- * @param boolean $float (optional) float or integer format
- *
- * @return mixed
- * @since 1.0
- * @access public
- * @see getValue(), getMaximum(),
- * HTML_Progress_DM::getPercentComplete()
- */
- function getPercentComplete($float = true)
- {
- return $this->_DM->getPercentComplete($float);
- }
-
- /**
- * Returns the look-and-feel object that renders the progress bar.
- *
- * @return object
- * @since 1.0
- * @access public
- * @see setUI()
- */
- function &getUI()
- {
- return $this->_UI;
- }
-
- /**
- * Sets the look-and-feel object that renders the progress bar.
- *
- * @param string $ui class name of a html_progress_ui extends object
- *
- * @return void
- * @since 1.0
- * @access public
- * @throws HTML_PROGRESS_ERROR_INVALID_INPUT
- * @see getUI()
- */
- function setUI($ui)
- {
- if (!class_exists($ui)) {
- return HTML_Progress::raiseError(HTML_PROGRESS_ERROR_INVALID_INPUT, 'error',
- array('var' => '$ui',
- 'was' => 'class does not exists',
- 'expected' => $ui.' class defined',
- 'paramnum' => 1));
- }
-
- $_ui = new $ui();
-
- if (!is_a($_ui, 'html_progress_ui')) {
- return HTML_Progress::raiseError(HTML_PROGRESS_ERROR_INVALID_INPUT, 'error',
- array('var' => '$ui',
- 'was' => $ui,
- 'expected' => 'HTML_Progress_UI extends',
- 'paramnum' => 1));
- }
- $this->_UI =& $_ui;
- }
-
- /**
- * Sets the look-and-feel model that renders the progress bar.
- *
- * @param string $file file name of model properties
- * @param string $type type of external ressource (phpArray, iniFile, XML ...)
- *
- * @return void
- * @since 1.0
- * @access public
- * @throws HTML_PROGRESS_ERROR_INVALID_INPUT
- * @see setUI()
- */
- function setModel($file, $type)
- {
- if (!file_exists($file)) {
- return HTML_Progress::raiseError(HTML_PROGRESS_ERROR_INVALID_INPUT, 'error',
- array('var' => '$file',
- 'was' => $file,
- 'expected' => 'file exists',
- 'paramnum' => 1));
- }
-
- include_once 'Config.php';
-
- $conf = new Config();
-
- if (!$conf->isConfigTypeRegistered($type)) {
- return HTML_Progress::raiseError(HTML_PROGRESS_ERROR_INVALID_INPUT, 'error',
- array('var' => '$type',
- 'was' => $type,
- 'expected' => implode (" | ", array_keys($GLOBALS['CONFIG_TYPES'])),
- 'paramnum' => 2));
- }
-
- $data = $conf->parseConfig($file, $type);
-
- $structure = $data->toArray(false);
- $progress =& $structure['root'];
-
- $ui = new HTML_Progress_UI();
-
- if (isset($progress['core']['speed'])) {
- $this->setAnimSpeed(intval($progress['core']['speed']));
- }
-
- if (isset($progress['core']['indeterminate'])) {
- $mode = (strtolower(trim($progress['core']['indeterminate'])) == 'true');
- $this->setIndeterminate($mode);
- }
-
- if (isset($progress['core']['increment'])) {
- $this->setIncrement(intval($progress['core']['increment']));
- }
-
- if (isset($progress['core']['javascript']) && file_exists($progress['core']['javascript'])) {
- $ui->setScript($progress['core']['javascript']);
- }
-
- if (isset($progress['orientation']['shape'])) {
- $ui->setOrientation(intval($progress['orientation']['shape']));
- }
-
- if (isset($progress['orientation']['fillway'])) {
- $ui->setFillWay($progress['orientation']['fillway']);
- }
-
- if (isset($progress['cell']['count'])) {
- $ui->setCellCount(intval($progress['cell']['count']));
- }
-
- if (isset($progress['cell']['font-family'])) {
- if (is_array($progress['cell']['font-family'])) {
- $progress['cell']['font-family'] = implode(",", $progress['cell']['font-family']);
- }
- }
- if (isset($progress['cell'])) {
- $ui->setCellAttributes($progress['cell']);
- }
-
- if (isset($progress['border'])) {
- $this->setBorderPainted(true);
- $ui->setBorderAttributes($progress['border']);
- }
-
- if (isset($progress['string']['font-family'])) {
- if (is_array($progress['string']['font-family'])) {
- $progress['string']['font-family'] = implode(",", $progress['string']['font-family']);
- }
- }
- if (isset($progress['string'])) {
- $this->setStringPainted(true);
- $ui->setStringAttributes($progress['string']);
- }
-
- if (isset($progress['progress'])) {
- $ui->setProgressAttributes($progress['progress']);
- }
-
- $this->_UI = $ui;
- }
-
- /**
- * Returns delay execution of the progress bar
- *
- * @return integer
- * @since 1.2.0RC1
- * @access public
- * @see setAnimSpeed()
- */
- function getAnimSpeed()
- {
- return $this->_anim_speed;
- }
-
- /**
- * Set the delays progress bar execution for the given number of miliseconds.
- *
- * @param integer $delay Delay in milisecond.
- *
- * @return void
- * @since 1.1
- * @access public
- * @throws HTML_PROGRESS_ERROR_INVALID_INPUT
- * @see getAnimSpeed()
- */
- function setAnimSpeed($delay)
- {
- if (!is_int($delay)) {
- return HTML_Progress::raiseError(HTML_PROGRESS_ERROR_INVALID_INPUT, 'exception',
- array('var' => '$delay',
- 'was' => gettype($delay),
- 'expected' => 'integer',
- 'paramnum' => 1));
-
- } elseif ($delay < 0) {
- return HTML_Progress::raiseError(HTML_PROGRESS_ERROR_INVALID_INPUT, 'error',
- array('var' => '$delay',
- 'was' => $delay,
- 'expected' => 'greater than zero',
- 'paramnum' => 1));
-
- } elseif ($delay > 1000) {
- return HTML_Progress::raiseError(HTML_PROGRESS_ERROR_INVALID_INPUT, 'error',
- array('var' => '$delay',
- 'was' => $delay,
- 'expected' => 'less or equal 1000',
- 'paramnum' => 1));
- }
- $this->_anim_speed = $delay;
- }
-
- /**
- * Get the cascading style sheet to put inline on HTML document
- *
- * @return string
- * @since 1.0
- * @access public
- * @see HTML_Progress_UI::getStyle()
- */
- function getStyle()
- {
- $ui = $this->getUI();
- $lnEnd = $ui->_getLineEnd();
-
- $style = $lnEnd . $ui->getStyle();
- $style = str_replace('{%pIdent%}', '.'.$this->getIdent(), $style);
-
- if (!$this->isBorderPainted()) {
- $style = ereg_replace('border-width: [0-9]+px;', 'border-width: 0;', $style);
- }
- return $style;
- }
-
- /**
- * Get the javascript code to manage progress bar.
- *
- * @return string JavaScript URL or inline code to manage progress bar
- * @since 1.0
- * @access public
- * @see HTML_Progress_UI::getScript()
- */
- function getScript()
- {
- $ui = $this->getUI();
- $js = $ui->getScript();
- return $js;
- }
-
- /**
- * Returns the progress bar structure in an array.
- *
- * @return array of progress bar properties
- * @since 1.0
- * @access public
- */
- function toArray()
- {
- $ui =& $this->getUI();
- $dm =& $this->getDM();
-
- $_structure = array();
- $_structure['id'] = $this->getIdent();
- $_structure['indeterminate'] = $this->isIndeterminate();
- $_structure['borderpainted'] = $this->isBorderPainted();
- $_structure['stringpainted'] = $this->isStringPainted();
- $_structure['string'] = $this->_progressString;
- $_structure['animspeed'] = $this->getAnimSpeed();
- $_structure['ui']['classID'] = get_class($ui);
- $_structure['ui']['orientation'] = $ui->getOrientation();
- $_structure['ui']['fillway'] = $ui->getFillWay();
- $_structure['ui']['cell'] = $ui->getCellAttributes();
- $_structure['ui']['cell']['count'] = $ui->getCellCount();
- $_structure['ui']['border'] = $ui->getBorderAttributes();
- $_structure['ui']['string'] = $ui->getStringAttributes();
- $_structure['ui']['progress'] = $ui->getProgressAttributes();
- $_structure['ui']['script'] = $ui->getScript();
- $_structure['dm']['classID'] = get_class($dm);
- $_structure['dm']['minimum'] = $dm->getMinimum();
- $_structure['dm']['maximum'] = $dm->getMaximum();
- $_structure['dm']['increment'] = $dm->getIncrement();
- $_structure['dm']['value'] = $dm->getValue();
- $_structure['dm']['percent'] = $dm->getPercentComplete(false);
-
- return $_structure;
- }
-
- /**
- * Returns the progress structure as HTML.
- *
- * @return string HTML Progress bar
- * @since 0.2
- * @access public
- */
- function toHtml()
- {
- $strHtml = '';
- $ui =& $this->_UI;
- $tabs = $ui->_getTabs();
- $tab = $ui->_getTab();
- $lnEnd = $ui->_getLineEnd();
- $comment = $ui->getComment();
- $orient = $ui->getOrientation();
- $progressAttr = $ui->getProgressAttributes();
- $borderAttr = $ui->getBorderAttributes();
- $stringAttr = $ui->getStringAttributes();
- $valign = strtolower($stringAttr['valign']);
-
- /**
- * Adds a progress bar legend in html code is possible.
- * See HTML_Common::setComment() method.
- */
- if (strlen($comment) > 0) {
- $strHtml .= $tabs . "<!-- $comment -->" . $lnEnd;
- }
-
- $strHtml .= $tabs . "<div id=\"".$this->getIdent()."_progress\" class=\"".$this->getIdent()."\">" . $lnEnd;
- $strHtml .= $tabs . "<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">" . $lnEnd;
- $progressId = $this->getIdent().'_';
-
- /**
- * Creates all cells of progress bar in order
- * depending of the FillWay and Orientation.
- */
- if ($orient == HTML_PROGRESS_BAR_HORIZONTAL) {
- $progressHtml = $this->_getProgressHbar_toHtml();
- }
-
- if ($orient == HTML_PROGRESS_BAR_VERTICAL) {
- $progressHtml = $this->_getProgressVbar_toHtml();
- }
-
- if ($orient == HTML_PROGRESS_POLYGONAL) {
- $progressHtml = $this->_getProgressPolygonal_toHtml();
- }
-
- if ($orient == HTML_PROGRESS_CIRCLE) {
- $cellAttr = $ui->getCellAttributes();
- if (!isset($cellAttr[0]['background-image']) || !file_exists($cellAttr[0]['background-image'])) {
- // creates default circle segments pictures :
- // 'c0.png'->0% 'c1.png'->10%, 'c2.png'->20%, ... 'c10.png'->100%
- $ui->drawCircleSegments();
- }
- $progressHtml = $this->_getProgressCircle_toHtml();
- }
-
- /**
- * Progress Bar (2) alignment rules:
- * - percent / messsage area (1)
- *
- * +---------------------------------------+
- * | +t1---+ |
- * | | (1) | |
- * | +-----+ |
- * | +t2---+ +-------------------+ +t3---+ |
- * | | (1) | | | | | (2) | | | | | | (1) | |
- * | +-----+ +-------------------+ +-----+ |
- * | +t4---+ |
- * | | (1) | |
- * | +-----+ |
- * +---------------------------------------+
- */
- if (($valign == 'left') || ($valign == 'right')) {
- $tRows = 1;
- $tCols = 2;
- $ps = ($valign == 'left') ? 0 : 1;
- } else {
- $tRows = 2;
- $tCols = 1;
- $ps = ($valign == 'top') ? 0 : 1;
- }
-
- for ($r = 0 ; $r < $tRows ; $r++) {
- $strHtml .= $tabs . "<tr>" . $lnEnd;
- for ($c = 0 ; $c < $tCols ; $c++) {
- if (($c == $ps) || ($r == $ps)) {
- $id = $stringAttr['id'];
- $strHtml .= $tabs . $tab . "<td class=\"$id\" id=\"$progressId$id\">" . $lnEnd;
- $strHtml .= $tabs . $tab . $tab . $this->getString() . $lnEnd;
- $ps = -1;
- } else {
- $class = $progressAttr['class'];
- $strHtml .= $tabs . $tab ."<td class=\"$class\">" . $lnEnd;
- $strHtml .= $tabs . $tab . $tab . "<div class=\"".$borderAttr['class']."\">" . $lnEnd;
- $strHtml .= $progressHtml;
- $strHtml .= $tabs . $tab . $tab . "</div>" . $lnEnd;
- }
- $strHtml .= $tabs . $tab ."</td>" . $lnEnd;
- }
- $strHtml .= $tabs . "</tr>" . $lnEnd;
- }
-
- $strHtml .= $tabs . "</table>" . $lnEnd;
- $strHtml .= $tabs . "</div>" . $lnEnd;
-
- return $strHtml;
- }
-
- /**
- * Renders the new value of progress bar.
- *
- * @return void
- * @since 0.2
- * @access public
- */
- function display()
- {
- static $lnEnd;
- static $cellAmount;
- static $determinate;
-
- if(!isset($lnEnd)) {
- $ui =& $this->_UI;
- $lnEnd = $ui->_getLineEnd();
- $cellAmount = ($this->getMaximum() - $this->getMinimum()) / $ui->getCellCount();
- }
-
- if (function_exists('ob_get_clean')) {
- $bar = ob_get_clean(); // use for PHP 4.3+
- } else {
- $bar = ob_get_contents(); // use for PHP 4.2+
- ob_end_clean();
- }
- $bar .= $lnEnd;
-
- $progressId = $this->getIdent().'_';
-
- if ($this->isIndeterminate()) {
- if (isset($determinate)) {
- $determinate++;
- $progress = $determinate;
- } else {
- $progress = $determinate = 1;
- }
- } else {
- $progress = ($this->getValue() - $this->getMinimum()) / $cellAmount;
- $determinate = 0;
- }
- $bar .= '<script type="text/javascript">self.setprogress("'.$progressId.'",'.((int) $progress).',"'.$this->getString().'",'.$determinate.'); </script>';
-
- echo $bar;
- ob_start();
- }
-
- /**
- * Hides the progress bar.
- *
- * @return void
- * @since 1.2.0RC3
- * @access public
- */
- function hide()
- {
- $ui = $this->getUI();
- $lnEnd = $ui->_getLineEnd();
- $progressId = $this->getIdent().'_';
-
- if (function_exists('ob_get_clean')) {
- $bar = ob_get_clean(); // use for PHP 4.3+
- } else {
- $bar = ob_get_contents(); // use for PHP 4.2+
- ob_end_clean();
- }
- $bar .= $lnEnd;
- $bar .= '<script type="text/javascript">self.hideProgress("'.$progressId.'"); </script>';
- echo $bar;
- }
-
- /**
- * Default user callback when none are defined.
- * Delay execution of progress meter for the given number of milliseconds.
- *
- * NOTE: The function {@link http://www.php.net/manual/en/function.usleep.php}
- * did not work on Windows systems until PHP 5.0.0
- *
- * @return void
- * @since 1.2.0RC3
- * @access public
- * @see getAnimSpeed(), setAnimSpeed(), process()
- */
- function sleep()
- {
- // convert delay from milliseconds to microseconds
- $usecs = $this->getAnimSpeed()*1000;
-
- if ((substr(PHP_OS, 0, 3) == 'WIN') && (substr(PHP_VERSION,0,1) < '5') ){
- for ($i=0; $i<$usecs; $i++) { }
- } else {
- usleep($usecs);
- }
- }
-
- /**
- * Sets the user callback function that execute all actions pending progress
- *
- * @param mixed $handler Name of function or a class-method.
- *
- * @return void
- * @since 1.2.0RC3
- * @access public
- * @throws HTML_PROGRESS_ERROR_INVALID_CALLBACK
- * @see process()
- */
- function setProgressHandler($handler)
- {
- if (!is_callable($handler)) {
- return HTML_Progress::raiseError(HTML_PROGRESS_ERROR_INVALID_CALLBACK, 'warning',
- array('var' => '$handler',
- 'element' => 'valid Class-Method/Function',
- 'was' => 'element',
- 'paramnum' => 1));
- }
- $this->_callback = $handler;
- }
-
- /**
- * Performs the progress actions
- *
- * @return void
- * @since 1.2.0RC3
- * @access public
- * @see sleep()
- */
- function process()
- {
- if (!$this->_callbackExists($this->_callback)) {
- // when there is no valid user callback then default is to sleep a bit ...
- $this->sleep();
- } else {
- call_user_func_array($this->_callback, array($this->getValue(), &$this));
- }
- }
-
- /**
- * Runs the progress bar (both modes: indeterminate and determinate),
- * and execute all actions defined in user callback identified by
- * method setProgressHandler.
- *
- * @return void
- * @since 1.2.0RC3
- * @access public
- * @see process(), setProgressHandler()
- */
- function run()
- {
- do {
- $this->display();
- $this->process();
- if ($this->getPercentComplete() == 1) {
- if ($this->isIndeterminate()) {
- $this->setValue(0);
- } else {
- return;
- }
- }
- $this->incValue();
- } while(1);
- }
-
- /**
- * Returns the current identification string.
- *
- * @return string current Progress instance's identification string
- * @since 1.0
- * @access public
- * @see setIdent()
- */
- function getIdent()
- {
- return $this->_ident;
- }
-
- /**
- * Sets this Progress instance's identification string.
- *
- * @param mixed $ident (optional) the new identification string.
- *
- * @since 1.0
- * @access public
- * @see getIdent()
- */
- function setIdent($ident = null)
- {
- if (is_null($ident)) {
- $this->_ident = 'p_' . substr(md5(microtime()), 0, 6);
- } else {
- $this->_ident = $ident;
- }
- }
-
- /**
- * Returns an array of all the listeners added to this progress bar.
- *
- * @return array
- * @since 1.0
- * @access public
- * @see addListener(), removeListener()
- */
- function getListeners()
- {
- return $this->_listeners;
- }
-
- /**
- * Adds a HTML_Progress_Observer instance to the list of observers
- * that are listening for messages emitted by this HTML_Progress instance.
- *
- * @param object $observer The HTML_Progress_Observer instance
- * to attach as a listener.
- *
- * @return boolean True if the observer is successfully attached.
- * @since 1.0
- * @access public
- * @see getListeners(), removeListener()
- */
- function addListener($observer)
- {
- if (!is_a($observer, 'HTML_Progress_Observer') &&
- !is_a($observer, 'HTML_Progress_Monitor')) {
- return false;
- }
- $this->_listeners[$observer->_id] = &$observer;
- return true;
- }
-
- /**
- * Removes a HTML_Progress_Observer instance from the list of observers.
- *
- * @param object $observer The HTML_Progress_Observer instance
- * to detach from the list of listeners.
- *
- * @return boolean True if the observer is successfully detached.
- * @since 1.0
- * @access public
- * @see getListeners(), addListener()
- */
- function removeListener($observer)
- {
- if ((!is_a($observer, 'HTML_Progress_Observer') &&
- !is_a($observer, 'HTML_Progress_Monitor')
- ) ||
- (!isset($this->_listeners[$observer->_id])) ) {
-
- return false;
- }
- unset($this->_listeners[$observer->_id]);
- return true;
- }
-
- /**
- * Notifies all listeners that have registered interest in $event message.
- *
- * @param mixed $event A hash describing the progress event.
- *
- * @since 1.0
- * @access private
- * @see setMinimum(), setMaximum(), setValue(), incValue()
- */
- function _announce($event)
- {
- foreach ($this->_listeners as $id => $listener) {
- $this->_listeners[$id]->notify($event);
- }
- }
-
- /**
- * Returns a horizontal progress bar structure as HTML.
- *
- * @return string Horizontal HTML Progress bar
- * @since 1.0
- * @access private
- */
- function _getProgressHbar_toHtml()
- {
- $ui =& $this->_UI;
- $tabs = $ui->_getTabs();
- $tab = $ui->_getTab();
- $lnEnd = $ui->_getLineEnd();
- $way_natural = ($ui->getFillWay() == 'natural');
- $cellAttr = $ui->getCellAttributes();
- $cellCount = $ui->getCellCount();
-
- $progressId = $this->getIdent().'_';
- $progressHtml = "";
-
- if ($way_natural) {
- // inactive cells first
- $pos = $cellAttr['spacing'];
- for ($i=0; $i<$cellCount; $i++) {
- $progressHtml .= $tabs . $tab . $tab;
- $progressHtml .= "<div id=\"". $progressId . sprintf($cellAttr['id'],$i) ."I\"";
- $progressHtml .= " class=\"".$cellAttr['class']."I\"";
- $progressHtml .= " style=\"position:absolute;top:".$cellAttr['spacing']."px;left:".$pos."px;\"";
- $progressHtml .= "> </div>" . $lnEnd;
- $pos += ($cellAttr['width'] + $cellAttr['spacing']);
- }
- // then active cells
- $pos = $cellAttr['spacing'];
- for ($i=0; $i<$cellCount; $i++) {
- $progressHtml .= $tabs . $tab . $tab;
- $progressHtml .= "<div id=\"". $progressId . sprintf($cellAttr['id'],$i) ."A\"";
- $progressHtml .= " class=\"".$cellAttr['class']."A\"";
- $progressHtml .= " style=\"position:absolute;top:".$cellAttr['spacing']."px;left:".$pos."px;";
- if (isset($cellAttr[$i])) {
- $progressHtml .= "color:".$cellAttr[$i]['color'].";\"";
- } else {
- $progressHtml .= "\"";
- }
- $progressHtml .= "> </div>" . $lnEnd;
- $pos += ($cellAttr['width'] + $cellAttr['spacing']);
- }
- } else {
- // inactive cells first
- $pos = $cellAttr['spacing'];
- for ($i=$cellCount-1; $i>=0; $i--) {
- $progressHtml .= $tabs . $tab . $tab;
- $progressHtml .= "<div id=\"". $progressId . sprintf($cellAttr['id'],$i) ."I\"";
- $progressHtml .= " class=\"".$cellAttr['class']."I\"";
- $progressHtml .= " style=\"position:absolute;top:".$cellAttr['spacing']."px;left:".$pos."px;\"";
- $progressHtml .= "> </div>" . $lnEnd;
- $pos += ($cellAttr['width'] + $cellAttr['spacing']);
- }
- // then active cells
- $pos = $cellAttr['spacing'];
- for ($i=$cellCount-1; $i>=0; $i--) {
- $progressHtml .= $tabs . $tab . $tab;
- $progressHtml .= "<div id=\"". $progressId . sprintf($cellAttr['id'],$i) ."A\"";
- $progressHtml .= " class=\"".$cellAttr['class']."A\"";
- $progressHtml .= " style=\"position:absolute;top:".$cellAttr['spacing']."px;left:".$pos."px;";
- if (isset($cellAttr[$i])) {
- $progressHtml .= "color:".$cellAttr[$i]['color'].";\"";
- } else {
- $progressHtml .= "\"";
- }
- $progressHtml .= "> </div>" . $lnEnd;
- $pos += ($cellAttr['width'] + $cellAttr['spacing']);
- }
- }
- return $progressHtml;
- }
-
- /**
- * Returns a vertical progress bar structure as HTML.
- *
- * @return string Vertical HTML Progress bar
- * @since 1.0
- * @access private
- */
- function _getProgressVbar_toHtml()
- {
- $ui =& $this->_UI;
- $tabs = $ui->_getTabs();
- $tab = $ui->_getTab();
- $lnEnd = $ui->_getLineEnd();
- $way_natural = ($ui->getFillWay() == 'natural');
- $cellAttr = $ui->getCellAttributes();
- $cellCount = $ui->getCellCount();
-
- $progressId = $this->getIdent().'_';
- $progressHtml = "";
-
- if ($way_natural) {
- // inactive cells first
- $pos = $cellAttr['spacing'];
- for ($i=$cellCount-1; $i>=0; $i--) {
- $progressHtml .= $tabs . $tab . $tab;
- $progressHtml .= "<div id=\"". $progressId . sprintf($cellAttr['id'],$i) ."I\"";
- $progressHtml .= " class=\"".$cellAttr['class']."I\"";
- $progressHtml .= " style=\"position:absolute;left:".$cellAttr['spacing']."px;top:".$pos."px;\"";
- $progressHtml .= "> </div>" . $lnEnd;
- $pos += ($cellAttr['height'] + $cellAttr['spacing']);
- }
- // then active cells
- $pos = $cellAttr['spacing'];
- for ($i=$cellCount-1; $i>=0; $i--) {
- $progressHtml .= $tabs . $tab . $tab;
- $progressHtml .= "<div id=\"". $progressId . sprintf($cellAttr['id'],$i) ."A\"";
- $progressHtml .= " class=\"".$cellAttr['class']."A\"";
- $progressHtml .= " style=\"position:absolute;left:".$cellAttr['spacing']."px;top:".$pos."px;";
- if (isset($cellAttr[$i])) {
- $progressHtml .= "color:".$cellAttr[$i]['color'].";\"";
- } else {
- $progressHtml .= "\"";
- }
- $progressHtml .= "> </div>" . $lnEnd;
- $pos += ($cellAttr['height'] + $cellAttr['spacing']);
- }
- } else {
- // inactive cells first
- $pos = $cellAttr['spacing'];
- for ($i=0; $i<$cellCount; $i++) {
- $progressHtml .= $tabs . $tab . $tab;
- $progressHtml .= "<div id=\"". $progressId . sprintf($cellAttr['id'],$i) ."I\"";
- $progressHtml .= " class=\"".$cellAttr['class']."I\"";
- $progressHtml .= " style=\"position:absolute;left:".$cellAttr['spacing']."px;top:".$pos."px;\"";
- $progressHtml .= "> </div>" . $lnEnd;
- $pos += ($cellAttr['height'] + $cellAttr['spacing']);
- }
- // then active cells
- $pos = $cellAttr['spacing'];
- for ($i=0; $i<$cellCount; $i++) {
- $progressHtml .= $tabs . $tab . $tab;
- $progressHtml .= "<div id=\"". $progressId . sprintf($cellAttr['id'],$i) ."A\"";
- $progressHtml .= " class=\"".$cellAttr['class']."A\"";
- $progressHtml .= " style=\"position:absolute;left:".$cellAttr['spacing']."px;top:".$pos."px;";
- if (isset($cellAttr[$i])) {
- $progressHtml .= "color:".$cellAttr[$i]['color'].";\"";
- } else {
- $progressHtml .= "\"";
- }
- $progressHtml .= "> </div>" . $lnEnd;
- $pos += ($cellAttr['height'] + $cellAttr['spacing']);
- }
- }
- return $progressHtml;
- }
-
- /**
- * Returns a polygonal progress structure as HTML.
- *
- * @return string Polygonal HTML Progress
- * @since 1.2.0RC1
- * @access private
- */
- function _getProgressPolygonal_toHtml()
- {
- $ui =& $this->_UI;
- $tabs = $ui->_getTabs();
- $tab = $ui->_getTab();
- $lnEnd = $ui->_getLineEnd();
- $way_natural = ($ui->getFillWay() == 'natural');
- $cellAttr = $ui->getCellAttributes();
- $cellCount = $ui->getCellCount();
- $coord = $ui->_coordinates;
-
- $progressId = $this->getIdent().'_';
- $progressHtml = "";
-
- if ($way_natural) {
- // inactive cells first
- for ($i=0; $i<$cellCount; $i++) {
- $top = $coord[$i][0] * $cellAttr['width'];
- $left = $coord[$i][1] * $cellAttr['height'];
- $progressHtml .= $tabs . $tab . $tab;
- $progressHtml .= "<div id=\"". $progressId . sprintf($cellAttr['id'],$i) ."I\"";
- $progressHtml .= " class=\"".$cellAttr['class']."I\"";
- $progressHtml .= " style=\"position:absolute;top:".$top."px;left:".$left."px;\"";
- $progressHtml .= "> </div>" . $lnEnd;
- }
- // then active cells
- for ($i=0; $i<$cellCount; $i++) {
- $top = $coord[$i][0] * $cellAttr['width'];
- $left = $coord[$i][1] * $cellAttr['height'];
- $progressHtml .= $tabs . $tab . $tab;
- $progressHtml .= "<div id=\"". $progressId . sprintf($cellAttr['id'],$i) ."A\"";
- $progressHtml .= " class=\"".$cellAttr['class']."A\"";
- $progressHtml .= " style=\"position:absolute;top:".$top."px;left:".$left."px;\"";
- if (isset($cellAttr[$i])) {
- $progressHtml .= "color:".$cellAttr[$i]['color'].";\"";
- } else {
- $progressHtml .= "\"";
- }
- $progressHtml .= "> </div>" . $lnEnd;
- }
- } else {
- $c = count($coord) - 1;
- // inactive cells first
- for ($i=0; $i<$cellCount; $i++) {
- $top = $coord[$c-$i][0] * $cellAttr['width'];
- $left = $coord[$c-$i][1] * $cellAttr['height'];
- $progressHtml .= $tabs . $tab . $tab;
- $progressHtml .= "<div id=\"". $progressId . sprintf($cellAttr['id'],$i) ."I\"";
- $progressHtml .= " class=\"".$cellAttr['class']."I\"";
- $progressHtml .= " style=\"position:absolute;top:".$top."px;left:".$left."px;\"";
- $progressHtml .= "> </div>" . $lnEnd;
- }
- // then active cells
- for ($i=0; $i<$cellCount; $i++) {
- $top = $coord[$c-$i][0] * $cellAttr['width'];
- $left = $coord[$c-$i][1] * $cellAttr['height'];
- $progressHtml .= $tabs . $tab . $tab;
- $progressHtml .= "<div id=\"". $progressId . sprintf($cellAttr['id'],$i) ."A\"";
- $progressHtml .= " class=\"".$cellAttr['class']."A\"";
- $progressHtml .= " style=\"position:absolute;top:".$top."px;left:".$left."px;\"";
- if (isset($cellAttr[$i])) {
- $progressHtml .= "color:".$cellAttr[$i]['color'].";\"";
- } else {
- $progressHtml .= "\"";
- }
- $progressHtml .= "> </div>" . $lnEnd;
- }
- }
- return $progressHtml;
- }
-
- /**
- * Returns a circle progress structure as HTML.
- *
- * @return string Circle HTML Progress
- * @since 1.2.0RC1
- * @access private
- */
- function _getProgressCircle_toHtml()
- {
- $ui =& $this->_UI;
- $tabs = $ui->_getTabs();
- $tab = $ui->_getTab();
- $lnEnd = $ui->_getLineEnd();
- $way_natural = ($ui->getFillWay() == 'natural');
- $cellAttr = $ui->getCellAttributes();
- $cellCount = $ui->getCellCount();
-
- $progressId = $this->getIdent().'_';
- $progressHtml = "";
-
- if ($way_natural) {
- // inactive cells first
- for ($i=0; $i<$cellCount; $i++) {
- $progressHtml .= $tabs . $tab . $tab;
- $progressHtml .= "<div id=\"". $progressId . sprintf($cellAttr['id'],$i) ."I\"";
- $progressHtml .= " class=\"".$cellAttr['class']."I\"";
- $progressHtml .= " style=\"position:absolute;top:0;left:0;\"";
- $progressHtml .= "> </div>" . $lnEnd;
- }
- // then active cells
- for ($i=0; $i<$cellCount; $i++) {
- $progressHtml .= $tabs . $tab . $tab;
- $progressHtml .= "<div id=\"". $progressId . sprintf($cellAttr['id'],$i) ."A\"";
- $progressHtml .= " class=\"".$cellAttr['class']."A\"";
- $progressHtml .= " style=\"position:absolute;top:0;left:0;\"";
- $progressHtml .= "><img src=\"".$cellAttr[$i+1]['background-image']."\" border=\"0\" /></div>" . $lnEnd;
- }
- } else {
- // inactive cells first
- for ($i=0; $i<$cellCount; $i++) {
- $progressHtml .= $tabs . $tab . $tab;
- $progressHtml .= "<div id=\"". $progressId . sprintf($cellAttr['id'],$i) ."I\"";
- $progressHtml .= " class=\"".$cellAttr['class']."I\"";
- $progressHtml .= " style=\"position:absolute;top:0;left:0;\"";
- $progressHtml .= "> </div>" . $lnEnd;
- }
- // then active cells
- for ($i=0; $i<$cellCount; $i++) {
- $progressHtml .= $tabs . $tab . $tab;
- $progressHtml .= "<div id=\"". $progressId . sprintf($cellAttr['id'],$i) ."A\"";
- $progressHtml .= " class=\"".$cellAttr['class']."A\"";
- $progressHtml .= " style=\"position:absolute;top:0;left:0;\"";
- $progressHtml .= "><img src=\"".$cellAttr[$i+1]['background-image']."\" border=\"0\" /></div>" . $lnEnd;
- }
- }
- return $progressHtml;
- }
-
- /**
- * Checks for callback function existance
- *
- * @param mixed $callback a callback, like one used by call_user_func()
- *
- * @return boolean
- * @since 1.2.0RC3
- * @access private
- */
- function _callbackExists($callback)
- {
- if (is_string($callback)) {
- return function_exists($callback);
- } elseif (is_array($callback) && is_object($callback[0])) {
- return method_exists($callback[0], $callback[1]);
- } else {
- return false;
- }
- }
-
- /**
- * Initialize Error Handler
- *
- * Parameter '$prefs' contains a hash of options to define the error handler.
- * You may find :
- * 'message_callback' A callback to generate message body.
- * Default is: HTML_Progress::_msgCallback()
- * 'context_callback' A callback to generate context of error.
- * Default is: HTML_Progress::_getBacktrace()
- * 'push_callback' A callback to determine whether to allow an error
- * to be pushed or logged.
- * Default is: HTML_Progress::_handleError()
- * 'error_handler' A callback to manage all error raised.
- * Default is: HTML_Progress::_errorHandler()
- * 'handler' Hash of params to configure all handlers (display, file, mail ...)
- * There are only a display handler by default with options below:
- * <code>
- * array('display' => array('conf' => $options));
- * // where $options are:
- * $options = array(
- * 'lineFormat' => '<b>%1$s</b>: %2$s %3$s',
- * 'contextFormat' => ' in <b>%3$s</b> (file <b>%1$s</b> at line <b>%2$s</b>)'
- * );
- * </code>
- *
- * @param array $prefs hash of params to configure error handler
- *
- * @return void
- * @since 1.2.0
- * @access private
- * @static
- */
- function _initErrorHandler($prefs = array())
- {
- // error message mapping callback
- if (isset($prefs['message_callback']) && is_callable($prefs['message_callback'])) {
- $GLOBALS['_HTML_PROGRESS_CALLBACK_MESSAGE'] = $prefs['message_callback'];
- } else {
- $GLOBALS['_HTML_PROGRESS_CALLBACK_MESSAGE'] = array('HTML_Progress', '_msgCallback');
- }
-
- // error context mapping callback
- if (isset($prefs['context_callback']) && is_callable($prefs['context_callback'])) {
- $GLOBALS['_HTML_PROGRESS_CALLBACK_CONTEXT'] = $prefs['context_callback'];
- } else {
- $GLOBALS['_HTML_PROGRESS_CALLBACK_CONTEXT'] = array('HTML_Progress', '_getBacktrace');
- }
-
- // determine whether to allow an error to be pushed or logged
- if (isset($prefs['push_callback']) && is_callable($prefs['push_callback'])) {
- $GLOBALS['_HTML_PROGRESS_CALLBACK_PUSH'] = $prefs['push_callback'];
- } else {
- $GLOBALS['_HTML_PROGRESS_CALLBACK_PUSH'] = array('HTML_Progress', '_handleError');
- }
-
- // default error handler will use PEAR_Error
- if (isset($prefs['error_handler']) && is_callable($prefs['error_handler'])) {
- $GLOBALS['_HTML_PROGRESS_CALLBACK_ERRORHANDLER'] = $prefs['error_handler'];
- } else {
- $GLOBALS['_HTML_PROGRESS_CALLBACK_ERRORHANDLER'] = array('HTML_Progress', '_errorHandler');
- }
-
- // only a display handler is set by default with specific settings
- $conf = array('lineFormat' => '<b>%1$s</b>: %2$s %3$s',
- 'contextFormat' => ' in <b>%3$s</b> (file <b>%1$s</b> at line <b>%2$s</b>)'
- );
-
- $optionsHandler['display'] = array('conf' => $conf);
-
- if (isset($prefs['handler'])) {
- $optionsHandler = array_merge($optionsHandler, $prefs['handler']);
- }
- $GLOBALS['_HTML_PROGRESS_ERRORHANDLER_OPTIONS'] = $optionsHandler;
- }
-
- /**
- * Default callback to generate error messages for any instance
- *
- * @param array $err current error structure with context info
- *
- * @return string
- * @since 1.2.0RC1
- * @access private
- * @static
- */
- function _msgCallback($err)
- {
- $messages = HTML_Progress::_getErrorMessage();
- $mainmsg = $messages[$err['code']];
-
- if (count($err['params'])) {
- foreach ($err['params'] as $name => $val) {
- if (is_array($val)) {
- $val = implode(', ', $val);
- }
- $mainmsg = str_replace('%' . $name . '%', $val, $mainmsg);
- }
- }
- return $mainmsg;
- }
-
- /**
- * Standard file/line number/function/class context callback
- *
- * @return false|array
- * @since 1.2.0
- * @access private
- * @static
- */
- function _getBacktrace()
- {
- if (function_exists('debug_backtrace')) {
- $backtrace = debug_backtrace(); // PHP 4.3+
- $backtrace = $backtrace[count($backtrace)-1];
- } else {
- $backtrace = false; // PHP 4.1.x, 4.2.x (no context info available)
- }
- return $backtrace;
- }
-
- /**
- * Standard callback, this will be called every time an error
- * is pushed onto the stack. The return value will be used to determine
- * whether to allow an error to be pushed or logged.
- * Dies if the error is an exception (and would have died anyway)
- *
- * @param array $err current error structure with context info
- *
- * @return null|HTML_PROGRESS_ERRORSTACK_* constant
- * @since 1.2.0RC2
- * @access private
- * @static
- * @see HTML_PROGRESS_ERRORSTACK_PUSHANDLOG, HTML_PROGRESS_ERRORSTACK_PUSH,
- * HTML_PROGRESS_ERRORSTACK_LOG, HTML_PROGRESS_ERRORSTACK_IGNORE,
- * HTML_PROGRESS_ERRORSTACK_LOGANDDIE
- *
- */
- function _handleError($err)
- {
- if ($err['level'] == 'exception') {
- return HTML_PROGRESS_ERRORSTACK_LOGANDDIE;
- }
- }
-
- /**
- * Standard error handler that will use PEAR_Error object
- *
- * To improve performances, the PEAR.php file is included dynamically.
- * The file is so included only when an error is triggered. So, in most
- * cases, the file isn't included and perfs are much better.
- *
- * @param array $err current error structure with context info
- *
- * @return PEAR_Error
- * @since 1.2.0
- * @access private
- * @static
- */
- function _errorHandler($err)
- {
- include_once 'PEAR.php';
- $e = PEAR::raiseError($err['message'], $err['code'], PEAR_ERROR_RETURN, E_USER_ERROR,
- $err['context']);
-
- if (isset($err['context'])) {
- $file = $err['context']['file'];
- $line = $err['context']['line'];
- $func = $err['context']['class'];
- $func .= $err['context']['type'];
- $func .= $err['context']['function'];
- }
-
- $display_errors = ini_get('display_errors');
- $log_errors = ini_get('log_errors');
-
- $display = $GLOBALS['_HTML_PROGRESS_ERRORHANDLER_OPTIONS']['display'];
-
- if ($display_errors) {
- $lineFormat = $display['conf']['lineFormat'];
- $contextFormat = $display['conf']['contextFormat'];
-
- $context = sprintf($contextFormat, $file, $line, $func);
-
- printf($lineFormat."<br />\n", ucfirst($err['level']), $err['message'], $context);
- }
-
- if ($log_errors) {
- if (isset($GLOBALS['_HTML_PROGRESS_ERRORHANDLER_OPTIONS']['error_log'])) {
- $error_log = $GLOBALS['_HTML_PROGRESS_ERRORHANDLER_OPTIONS']['error_log'];
- $message_type = $error_log['name'];
- $destination = '';
- $extra_headers = '';
- $send = true;
-
- switch ($message_type) {
- case HTML_PROGRESS_LOG_TYPE_SYSTEM:
- break;
- case HTML_PROGRESS_LOG_TYPE_MAIL:
- $destination = $error_log['conf']['destination'];
- $extra_headers = $error_log['conf']['extra_headers'];
- break;
- case HTML_PROGRESS_LOG_TYPE_FILE:
- $destination = $error_log['conf']['destination'];
- break;
- default:
- $send = false;
- }
- if ($send) {
- /**
- * String containing the format of a log line.
- * Position arguments are:
- * $1 -> timestamp
- * $2 -> ident
- * $3 -> level
- * $4 -> message
- * $5 -> context
- */
- if (isset($error_log['conf']['lineFormat'])) {
- $lineFormat = $error_log['conf']['lineFormat'];
- } else {
- $lineFormat = '%1$s %2$s [%3$s] %4$s %5$s';
- }
-
- /**
- * String containing the timestamp format
- */
- if (isset($error_log['conf']['timeFormat'])) {
- $timeFormat = $error_log['conf']['timeFormat'];
- } else {
- $timeFormat = '%b %d %H:%M:%S';
- }
-
- /**
- * String containing the error execution context format
- */
- if (isset($error_log['conf']['contextFormat'])) {
- $contextFormat = $error_log['conf']['contextFormat'];
- } else {
- $contextFormat = strip_tags($display['conf']['contextFormat']);
- }
-
- /**
- * String containing the end-on-line character sequence
- */
- if (isset($error_log['conf']['eol'])) {
- $eol = $error_log['conf']['eol'];
- } else {
- $eol = "\n";
- }
-
- $context = sprintf($contextFormat, $file, $line, $func);
- $message = sprintf($lineFormat,
- strftime($timeFormat, $err['time']),
- $error_log['ident'],
- $err['level'],
- $err['message'],
- $context);
-
- error_log($message.$eol, $message_type, $destination, $extra_headers);
- }
- }
- }
- return $e;
- }
-
- /**
- * Error Message Template array
- *
- * @return string
- * @since 1.0
- * @access private
- */
- function _getErrorMessage()
- {
- $messages = array(
- HTML_PROGRESS_ERROR_INVALID_INPUT =>
- 'invalid input, parameter #%paramnum% '
- . '"%var%" was expecting '
- . '"%expected%", instead got "%was%"',
- HTML_PROGRESS_ERROR_INVALID_CALLBACK =>
- 'invalid callback, parameter #%paramnum% '
- . '"%var%" expecting %element%,'
- . ' instead got "%was%" does not exists',
- HTML_PROGRESS_DEPRECATED =>
- 'method is deprecated '
- . 'use %newmethod% instead of %oldmethod%'
-
- );
- return $messages;
- }
-
- /**
- * Add an error to the stack
- *
- * @param integer $code Error code.
- * @param string $level The error level of the message.
- * @param array $params Associative array of error parameters
- *
- * @return NULL|PEAR_Error PEAR_Error instance,
- * with context info if PHP 4.3.0+
- * @since 1.2.0RC1
- * @access public
- * @static
- * @see hasErrors(), getError()
- */
- function raiseError($code, $level, $params)
- {
- // obey at protocol
- if (error_reporting() == 0) {
- return;
- }
-
- // grab error context
- $context = call_user_func($GLOBALS['_HTML_PROGRESS_CALLBACK_CONTEXT']);
-
- // save error
- $time = explode(' ', microtime());
- $time = $time[1] + $time[0];
- $err = array(
- 'code' => $code,
- 'params' => $params,
- 'package' => 'HTML_Progress',
- 'level' => $level,
- 'time' => $time,
- 'context' => $context
- );
-
- // set up the error message, if necessary
- $err['message'] = call_user_func($GLOBALS['_HTML_PROGRESS_CALLBACK_MESSAGE'], $err);
-
- $push = $log = true;
- $die = false;
- $action = call_user_func($GLOBALS['_HTML_PROGRESS_CALLBACK_PUSH'], $err);
-
- switch($action){
- case HTML_PROGRESS_ERRORSTACK_IGNORE:
- $push = $log = false;
- break;
- case HTML_PROGRESS_ERRORSTACK_PUSH:
- $log = false;
- break;
- case HTML_PROGRESS_ERRORSTACK_LOG:
- $push = false;
- break;
- case HTML_PROGRESS_ERRORSTACK_LOGANDDIE:
- $push = false;
- $die = true;
- break;
- // anything else returned has the same effect as pushandlog
- }
-
- $e = false;
- if ($push) {
- array_unshift($GLOBALS['_HTML_PROGRESS_ERRORSTACK'], $err);
- }
- if ($log) {
- // default callback returns a PEAR_Error object
- $e = call_user_func($GLOBALS['_HTML_PROGRESS_CALLBACK_ERRORHANDLER'], $err);
- }
- if ($die) {
- die();
- }
- return $e;
- }
-
- /**
- * Determine whether there are errors into the HTML_Progress stack
- *
- * @return integer
- * @since 1.2.0RC3
- * @access public
- * @static
- * @see getError(), raiseError()
- */
- function hasErrors()
- {
- return count($GLOBALS['_HTML_PROGRESS_ERRORSTACK']);
- }
-
- /**
- * Pop an error off of the HTML_Progress stack
- *
- * @return false|array
- * @since 1.2.0RC3
- * @access public
- * @static
- * @see hasErrors(), raiseError()
- */
- function getError()
- {
- return @array_shift($GLOBALS['_HTML_PROGRESS_ERRORSTACK']);
- }
- }
- ?>